function precoding = design_precoding(channel, num_users, num_tx_antennas, num_rx_antennas)
% design_precoding - 为RSMA系统设计预编码矩阵
%
% 输入参数:
%   channel         - 信道矩阵元胞数组
%   num_users       - 用户数量
%   num_tx_antennas - 发射天线数量
%   num_rx_antennas - 每个用户的接收天线数量
%
% 输出参数:
%   precoding - 包含公共流和各用户私有流预编码向量的结构体

% 初始化预编码结构体
precoding = struct();

% 在RSMA中，我们需要为公共流和每个用户的私有流设计预编码向量
% 这里采用简化的零强制(ZF)和最大比合并(MRT)策略的组合

% 1. 为私有流设计零强制预编码
% ZF尝试消除用户间干扰
H_combined = [];
for u = 1:num_users
    H_combined = [H_combined; channel{u}];
end

% 计算伪逆作为ZF预编码矩阵
% 确保H_combined的行数不超过列数
if size(H_combined, 1) <= num_tx_antennas
    P_zf = H_combined' * inv(H_combined * H_combined');
else
    % 如果用户数过多，使用规范化的预编码
    P_zf = H_combined' / (H_combined * H_combined' + 0.1*eye(size(H_combined, 1)));
end

% 为每个用户提取预编码向量
precoding.private = cell(1, num_users);
for u = 1:num_users
    % 提取对应用户的ZF预编码向量
    start_idx = (u-1) * num_rx_antennas + 1;
    end_idx = u * num_rx_antennas;
    
    if num_rx_antennas == 1
        w_k = P_zf(:, u);
    else
        % 对于多天线接收，取第一个流的预编码向量
        w_k = P_zf(:, start_idx);
    end
    
    % 归一化
    w_k = w_k / norm(w_k);
    
    % 存储预编码向量
    precoding.private{u} = w_k;
end

% 2. 为公共流设计最大比合并(MRT)预编码
% MRT尝试最大化信号功率
H_sum = zeros(num_rx_antennas, num_tx_antennas);
for u = 1:num_users
    H_sum = H_sum + channel{u};
end

% 使用SVD找到最大特征值对应的右奇异向量
[~, ~, V] = svd(H_sum);
w_c = V(:, 1);  % 第一个右奇异向量

% 归一化
w_c = w_c / norm(w_c);

% 存储公共流预编码向量
precoding.common = w_c;

% 验证预编码向量的正交性
fprintf('预编码向量验证:\n');
fprintf('  公共流与私有流预编码向量的内积:\n');
for u = 1:num_users
    inner_product = abs(w_c' * precoding.private{u});
    fprintf('    用户 %d: %.4f\n', u, inner_product);
end

if num_users > 1
    fprintf('  私有流之间的预编码向量内积:\n');
    for i = 1:num_users
        for j = i+1:num_users
            inner_product = abs(precoding.private{i}' * precoding.private{j});
            fprintf('    用户 %d 与用户 %d: %.4f\n', i, j, inner_product);
        end
    end
end

end 